package Classes_Conexao;
// importa pacotes e componentes necessarios para rodar recursos do java
import Classes.Cliente;
import Classes.Servico;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class ServicoDAO {
    // instanciando um atributo da classe ServicoDAO.

    private Connection connection;

    public ServicoDAO() throws SQLException {
        this.connection = Conexao.getConnection();
    }

    // adiciona a instancia no banco de dados!
    public void adiciona(Servico servico) throws SQLException {
        // fazendo a consulta SQL, para inserir os valores nas colunas da tabela (os) no banco de dados.
        String sql = "insert into os (status, equipamento, acessorio, dataHora, notaFiscal, defeitoReclamar, clientes_codigo) values (?,?,?,?,?,?,?)";
        // insere os dados do servico com a conexao para o banco de dados.
        PreparedStatement stmt = connection.prepareStatement(sql);
        // busca os campos preenchidos na classe de Servicos.
        stmt.setString(1, servico.getStatus());
        stmt.setString(2, servico.getEquipamento());
        stmt.setString(3, servico.getAcessorio());
        stmt.setString(4, servico.getDataHora());
        stmt.setString(5, servico.getNotaFiscal());
        stmt.setString(6, servico.getDefeitoReclamar());
        stmt.setInt(7, servico.getCodigoCliente());

        //executa e fecha o comando
        stmt.execute();
        stmt.close();
    }

    // metodo que retorna o codigo do servico
    public ArrayList<Servico> retornaCodigo() {
        PreparedStatement comando;
        // cria uma ArrayList que guardara o codigo do serviço
        ArrayList<Servico> listaServico = new ArrayList<Servico>();

        try {
            // consulta SQL que buscará os dados da tabela de (os).
            String sql = "SELECT * FROM os";
            comando = connection.prepareStatement(sql);
            ResultSet rs = comando.executeQuery(sql); //executeQuery associado as operações de insert,delete,update.
            while (rs.next()) {
                Servico servico = new Servico();
                servico.setCodigoServico(rs.getInt("codigoServico"));
                // adiciona o codigo de serviço a listaServico.
                listaServico.add(servico);
            }
            // fecha o comando.
            comando.close();
            // retorna a listaServico.
            return listaServico;
            // instancia de erros
        } catch (SQLException sqle) {
            sqle.printStackTrace();
            return null;
        }
    }
    // metodo excluir, para excluir uma instancia pelo codigo no banco de dados

    public void excluir(Servico servico) {
        PreparedStatement comando;
        try {
            // consulta SQL que deleta a linha da tabela onde o codigo for passado.
            String sql = "DELETE FROM os WHERE codigoServico=?";
            comando = connection.prepareStatement(sql);
            // busca o codigo do Serviço
            comando.setInt(1, servico.getCodigoServico());
            // executa e fecha a instancia
            comando.execute();
            comando.close();
            // instancia de erros
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    // metodo que retorna todos os serviços salvos no banco de dados.

    public ArrayList<Servico> retornaTodosServicos() {
        PreparedStatement comando;
        ArrayList<Servico> listaServico = new ArrayList<Servico>();

        try {
            // consulta SQL que retorna todos os registros da tabela (os).
            String sql = "SELECT * FROM os, clientes WHERE os.clientes_codigo = clientes.codigo ";
            comando = connection.prepareStatement(sql);
            ResultSet rs = comando.executeQuery(sql); //ExecuteQuery é associado as operações de insert,delete,update.

            while (rs.next()) {
                // pega os registro que ele quer busca do banco de dados e salvar no servico.
                Servico servico = new Servico();
                servico.setCodigoServico(rs.getInt("codigoServico"));
                servico.setStatus(rs.getString("status"));
                servico.setEquipamento(rs.getString("equipamento"));
                servico.setAcessorio(rs.getString("acessorio"));
                servico.setDataHora(rs.getString("dataHora"));
                servico.setDataHSaida(rs.getString("dataHoraSaida"));
                servico.setNotaFiscal(rs.getString("notaFiscal"));
                servico.setDefeitoReclamar(rs.getString("defeitoReclamar"));
                servico.setCodigoCliente(rs.getInt("clientes_codigo"));
                servico.setCliente(rs.getString("nome"));
                servico.setTotal(rs.getDouble("total"));
                servico.setTecnicoResponsavel(rs.getString("tecnico"));
                // adiciona todos os registro no servico
                listaServico.add(servico);

            }
            // fecha a instancia de comandos
            comando.close();
            // retorna a listaServico
            return listaServico;
            // instancia de erros
        } catch (SQLException sqle) {
            sqle.printStackTrace();
            return null;
        }
    }
    // metodo que editar os dados da tabela de Serviço

    public void editar(Servico servico) {
        PreparedStatement comando;
        try {
            // consulta SQL que atualiza um dado da tabela de (os) do banco de dados passada pelo codigo do Serviço
            String sql = "UPDATE os SET status = ?, equipamento = ?, acessorio = ?, dataHora = ?, notaFiscal = ?, defeitoReclamar = ?, clientes_codigo = ? WHERE codigoServico = ?;";
            // chama a conexão
            comando = connection.prepareStatement(sql);
            comando.setString(1, servico.getStatus());
            comando.setString(2, servico.getEquipamento());
            comando.setString(3, servico.getAcessorio());
            comando.setString(4, servico.getDataHora());
            comando.setString(5, servico.getNotaFiscal());
            comando.setString(6, servico.getDefeitoReclamar());
            comando.setInt(7, servico.getCodigoCliente());
            comando.setInt(8, servico.getCodigoServico());
            // executa a Atualização
            comando.executeUpdate();
            // fecha o comando
            comando.close();
            // instancia de erro
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    // metodo que retorna os serviços pelo tipo de status, para tabela no banco de dados.
    public ArrayList<Servico> retornaServicoPorStatus(String status) {
        PreparedStatement comando;
        ArrayList<Servico> listaServico = new ArrayList<Servico>();

        try {
            // consulta em SQL que retorna todos os registro da tabela (os) e da tabela clientes pelo status.
            String sql = "SELECT * FROM os, clientes WHERE os.clientes_codigo = clientes.codigo and os.status LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, status + "%");
            ResultSet rs = comando.executeQuery(); // executeQuery é associado as operações de insert,delete,update.

            while (rs.next()) {
                // pega os registro que precisa para fazer a filtragem no banco de dados da tabela serviço.
                Servico servico = new Servico();
                servico.setCodigoServico(rs.getInt("codigoServico"));
                servico.setStatus(rs.getString("status"));
                servico.setEquipamento(rs.getString("equipamento"));
                servico.setAcessorio(rs.getString("acessorio"));
                servico.setDataHora(rs.getString("dataHora"));
                servico.setDataHSaida(rs.getString("dataHoraSaida"));
                servico.setNotaFiscal(rs.getString("notaFiscal"));
                servico.setDefeitoReclamar(rs.getString("defeitoReclamar"));
                servico.setCodigoCliente(rs.getInt("clientes_codigo"));
                servico.setCliente(rs.getString("nome"));
                servico.setTotal(rs.getDouble("total"));
                servico.setTecnicoResponsavel(rs.getString("tecnico"));
                // adiciona todos os resultados na listaServico que é um arrayList.
                listaServico.add(servico);
            }
            // fecha o comando
            comando.close();
            // retorna a listaServico;
            return listaServico;
            // instancia de erro.
        } catch (SQLException sqle) {
            sqle.printStackTrace();
            return null;
        }
    }
    // metodo que vou ter que conserta depois.

    public ArrayList<Servico> retornaServicoPorNome(String nome) {
        PreparedStatement comando;
        ArrayList<Servico> listaServico = new ArrayList<Servico>();

        try {
            // consulta em SQL que busca todos os serviços com aquela caracteristica de nome.
            String sql = "SELECT * FROM os, clientes WHERE os.clientes_codigo = clientes.codigo and clientes.nome LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, nome + "%");
            ResultSet rs = comando.executeQuery(); // executeQuery é associado as operações de insert,delete,update.

            while (rs.next()) {
                Servico servico = new Servico();
                servico.setCodigoServico(rs.getInt("codigoServico"));
                servico.setStatus(rs.getString("status"));
                servico.setEquipamento(rs.getString("equipamento"));
                servico.setAcessorio(rs.getString("acessorio"));
                servico.setDataHora(rs.getString("dataHora"));
                servico.setDataHSaida(rs.getString("dataHoraSaida"));
                servico.setNotaFiscal(rs.getString("notaFiscal"));
                servico.setDefeitoReclamar(rs.getString("defeitoReclamar"));
                servico.setCodigoCliente(rs.getInt("clientes_codigo"));
                servico.setCliente(rs.getString("nome"));
                servico.setTotal(rs.getDouble("total"));
                servico.setTecnicoResponsavel(rs.getString("tecnico"));
                // adiciona todos os resultados na listaServico que um arrayList.
                listaServico.add(servico);
            }
            // fecha o comando
            comando.close();
            // retorna a listaServico;
            return listaServico;
            // instancia de erro.
        } catch (SQLException sqle) {
            sqle.printStackTrace();
            return null;
        }
    }
    // metodo que retorna campos por codigo do cliente.
    public ArrayList<Cliente> retornaCamposPorCodigo(String codigo) {
        PreparedStatement comando;
        ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();

        try {
            // consulta em SQL que busca todos da tabela clientes com as caracteristicas de codigo passadas.
            String sql = "SELECT * FROM clientes WHERE codigo LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, codigo + "%");
            ResultSet rs = comando.executeQuery(); // executeQuery é associado as operações de insert,delete,update.

            while (rs.next()) {
                Cliente cliente = new Cliente();
                cliente.setNome(rs.getString("nome"));
                cliente.setEndereco(rs.getString("endereco"));
                cliente.setBairro(rs.getString("bairro"));
                cliente.setCidade(rs.getString("cidade"));
                cliente.setFone1(rs.getString("fone1"));
                cliente.setCelular(rs.getString("cel"));
                cliente.setObs(rs.getString("obs"));
                // adiciona todos os resultados na listaCliente que um arrayList.
                listaCliente.add(cliente);
            }
            // fecha o comando
            comando.close();
            // retorna a listaServico;
            return listaCliente;
            // instancia de erro.
        } catch (SQLException sqle) {
            sqle.printStackTrace();
            return null;
        }
    }
}
